﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using WCFVeterinaria;

public partial class Animal : System.Web.UI.Page
{
    #region Variables globales
    ServiceVeterinaria gestorVet = new ServiceVeterinaria();
    DataTable tClasifAnimal = new DataTable();
    DataTable tClientes = new DataTable();
    #endregion

    #region Evento para cargar la página
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["username"] == null)
        {
            Response.Redirect("/Login.aspx");
        }
        try
        {
            if (!IsPostBack)
            {
                calFecha.Visible = false;
                calFecha.SelectedDate = DateTime.Now;
                tClasifAnimal = gestorVet.listarClasesAnimal();
                tClientes = gestorVet.listarClientes();
                cargarClasifAnimal();
                cargarClientes();
                obtenerAnimales();
                habilitarNuevo();
            }
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
        }
    }
    #endregion

    #region Evento Nuevo
    protected void btnNuevo_Click(object sender, EventArgs e)
    {
        habilitarNuevo();
    }
    #endregion

    #region Evento Agregar
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        try
        {
            DateTime fechaNac = new DateTime();
            fechaNac = DateTime.Now;
            int clasifAnimal = Convert.ToInt32(ddlClasifAnimal.SelectedValue.ToString());
            string identificacionID = ddlClientes.SelectedValue.ToString();
            if (!string.IsNullOrEmpty(txtFechaNacimiento.Text.Trim()))
            {
                fechaNac = calFecha.SelectedDate;
            }
            gestorVet.agregarAnimal(txtNombre.Text, txtColor.Text, fechaNac, clasifAnimal, identificacionID);
            obtenerAnimales();
            deshabilitarBotones();
            lblMensaje.Visible = true;
            lblMensaje.Text = "Registro insertado satisfactoriamente";
            lblMensaje.CssClass = "mensajeCorrecto";
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Evento Modificar
    protected void btnModificar_Click(object sender, EventArgs e)
    {
        try
        {
            DateTime fechaNac = new DateTime();
            int animalID = Convert.ToInt32(txtAnimalID.Text);
            int clasifAnimal = Convert.ToInt32(ddlClasifAnimal.SelectedValue.ToString());
            string identificacionID = ddlClientes.SelectedValue.ToString();
            if (!string.IsNullOrEmpty(txtFechaNacimiento.Text.Trim()))
            {
                fechaNac = calFecha.SelectedDate;
            }
            gestorVet.actualizarAnimal(animalID, txtNombre.Text, txtColor.Text, fechaNac, clasifAnimal, identificacionID);
            obtenerAnimales();
            deshabilitarBotones();
            lblMensaje.Visible = true;
            lblMensaje.Text = "Registro modificado satisfactoriamente";
            lblMensaje.CssClass = "mensajeCorrecto";
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Evento Eliminar
    protected void btnEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            int animalID = Convert.ToInt32(txtAnimalID.Text);
            gestorVet.eliminarAnimal(animalID);
            obtenerAnimales();
            deshabilitarBotones();
            lblMensaje.Visible = true;
            lblMensaje.Text = "Registro eliminado satisfactoriamente";
            lblMensaje.CssClass = "mensajeCorrecto";
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Evento Consultar
    protected void btnConsultar_Click(object sender, EventArgs e)
    {
        try
        {
            int animalID = Convert.ToInt32(txtAnimalID.Text);
            WCFVeterinaria.Animal animal = gestorVet.consultaAnimal(animalID);
            if (animal == null)
            {
                habilitarNuevo();
                lblMensaje.Visible = true;
                lblMensaje.Text = "No existe el animal con el ID " + txtAnimalID.Text;
                lblMensaje.CssClass = "mensajeError";
            }
            else
            {
                txtAnimalID.Text = animal.AnimalID.ToString();
                txtNombre.Text = HttpUtility.HtmlDecode(animal.Nombre.ToString());
                txtColor.Text = HttpUtility.HtmlDecode(animal.Color.ToString());
                string fechaNac = animal.FechaDeNacimiento.ToShortDateString();
                if (fechaNac.Equals("&nbsp;"))
                {
                    txtFechaNacimiento.Text = String.Empty;
                }
                else
                {
                    txtFechaNacimiento.Text = fechaNac;
                }
                ddlClasifAnimal.SelectedValue = Convert.ToString(animal.ClasificacionID);
                ddlClientes.SelectedValue = Convert.ToString(animal.IdentificacionID);
                habilitarExistente();
            }
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Método para habilitar un nuevo registro
    private void habilitarNuevo()
    {
        lbInsertar.Enabled = true;
        lbConsultar.Enabled = true;
        lbEliminar.Enabled = false;
        lbModificar.Enabled = false;
        txtAnimalID.Enabled = true;
        limpiar();
        txtAnimalID.Focus();
    }
    #endregion

    #region Método para habilitar un registro existente
    private void habilitarExistente()
    {
        lbInsertar.Enabled = false;
        lbConsultar.Enabled = false;
        lbEliminar.Enabled = true;
        lbModificar.Enabled = true;
    }
    #endregion

    #region Método para deshabilitar las acciones
    private void deshabilitarBotones()
    {
        lbInsertar.Enabled = false;
        lbConsultar.Enabled = false;
        lbEliminar.Enabled = false;
        lbModificar.Enabled = false;
        limpiar();
    }
    #endregion

    #region Método para limpiar el texto
    private void limpiar()
    {
        txtAnimalID.Text = string.Empty;
        txtNombre.Text = string.Empty;
        txtColor.Text = string.Empty;
        txtFechaNacimiento.Text = string.Empty;
        ddlClasifAnimal.SelectedIndex = 0;
        ddlClientes.SelectedIndex = 0;
        lblMensaje.Text = string.Empty;
    }
    #endregion

    #region Método para mostrar la fecha en el textbox
    protected void calFecha_Selection_Change(object sender, EventArgs e)
    {
        txtFechaNacimiento.Text = calFecha.SelectedDate.ToShortDateString();
        calFecha.Visible = false;
        /*DateTime fecha = new DateTime(calFecha.SelectedDate.Year,
                                          calFecha.SelectedDate.Month,
                                          calFecha.SelectedDate.Day);*/
    }
    #endregion

    #region Método para mostrar o ocultar el calendario
    protected void ibFecha_Click(object sender, ImageClickEventArgs e)
    {
        if (calFecha.Visible == false)
            calFecha.Visible = true;
        else
            calFecha.Visible = false;
    }
    #endregion

    #region Método para cargar el listado de la clasificación animal
    protected void cargarClasifAnimal()
    {
        if ( tClasifAnimal.Rows.Count > 0)
        {
            ddlClasifAnimal.DataSource = tClasifAnimal;
            tClasifAnimal.Columns.Add("clasif_nombre", typeof(string), "clasificacionID + ' - ' + nombre");
            ddlClasifAnimal.DataTextField = "clasif_nombre";
            ddlClasifAnimal.DataValueField = "clasificacionID";
            ddlClasifAnimal.DataBind();
        }
    }
    #endregion

    #region Método para cargar el listado de clientes
    protected void cargarClientes()
    {
        if (tClientes.Rows.Count > 0)
        {
            ddlClientes.DataSource = tClientes;
            tClientes.Columns.Add("nombre_completo", typeof(string), "identificacionID + ' - ' + nombre_o_razon_social + ' ' + apellidos");
            ddlClientes.DataTextField = "nombre_completo";
            ddlClientes.DataValueField = "identificacionID";
            ddlClientes.DataBind();
        }
    }
    #endregion

    #region Métodos para manejar las columnas del grid
    /// <summary>
    /// Columnas del grid
    /// </summary>
    private enum Columnas
    {
        AnimalID,
        Nombre,
        Color,
        Fecha_Nacimiento,
        clasificacionID,
        IdentificacionID
    }
    #endregion

    #region Método para obtener animales
    protected void obtenerAnimales()
    {
        try
        {
            DataTable tAnimal = gestorVet.listarAnimal();
            gvAnimal.DataSource = tAnimal;
            gvAnimal.DataBind();

            //Session que se va a utilizar para la paginación
            Session["DsAnimal"] = tAnimal;
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
            throw;
        }
    }
    #endregion

    #region Evento cambio de página
    protected void gvAnimal_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        try
        {
            //Se obtiene el listado de animales y se gestiona el evento de cambio de página.
            if ((DataTable)(Session["DsAnimal"]) != null)
            {
                DataTable dtTabla = (DataTable)(Session["DsAnimal"]);
                gvAnimal.PageIndex = e.NewPageIndex;
                gvAnimal.DataSource = ((DataTable)Session["DsAnimal"]).DefaultView;

                //Si el listado de animales se había ordenado por alguna de las columnas se mantiene el mismo orden para cada página.
                if (Session["sortDirection"] != null)
                {
                    DataView dataView = new DataView(dtTabla);
                    if (Session["sortDirection"].ToString().Equals(SortDirection.Ascending.ToString()))
                        dataView.Sort = Session["sortExpression"] + " " + ConvertSortDirectionToSql(SortDirection.Ascending);
                    else
                        dataView.Sort = Session["sortExpression"] + " " + ConvertSortDirectionToSql(SortDirection.Descending);

                    gvAnimal.DataSource = dataView;
                }
                gvAnimal.DataBind();
            }
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
            throw;
        }
    }
    #endregion

    #region Evento para ordenar la clasificacion animal
    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;
            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }
        return newSortDirection;
    }

    protected void gvAnimal_Sorting(object sender, GridViewSortEventArgs e)
    {
        try
        {
            DataTable dataTable = (DataTable)(Session["DsAnimal"]);

            //Se controla la direccion de las columnas, si se selecciona la misma columna dos veces se cambia de direccion 
            //ya sea ascendente o descendente
            if (Session["sortExpression"] != null && Session["sortExpression"].ToString() == e.SortExpression.ToString())
            {
                if (Session["sortDirection"].ToString().Equals(SortDirection.Ascending.ToString()))
                    e.SortDirection = SortDirection.Descending;
            }
            if (dataTable != null)
            {
                DataView dataView = new DataView(dataTable);
                dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
                gvAnimal.DataSource = dataView;
                gvAnimal.DataBind();
                Session["sortExpression"] = e.SortExpression;
                Session["sortDirection"] = e.SortDirection;
            }
        }
        catch
        {
            throw;
        }
    }
    #endregion

    #region Evento para seleccionar un animal
    protected void gvAnimal_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        try
        {
            lblMensaje.Visible = false;
            GridViewRow gvrFilaSeleccionada = gvAnimal.Rows[e.NewSelectedIndex];
            txtAnimalID.Text = HttpUtility.HtmlDecode(Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.AnimalID].Text.Trim()));
            txtNombre.Text = HttpUtility.HtmlDecode(Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Nombre].Text.Trim()));
            txtColor.Text = HttpUtility.HtmlDecode(Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Color].Text.Trim()));
            txtFechaNacimiento.Text = HttpUtility.HtmlDecode(Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Fecha_Nacimiento].Text.Trim()));
            ddlClasifAnimal.SelectedValue = HttpUtility.HtmlDecode(Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.clasificacionID].Text.Trim()));
            ddlClientes.SelectedValue = HttpUtility.HtmlDecode(Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.IdentificacionID].Text.Trim()));
            txtAnimalID.Enabled = false;
            habilitarExistente();
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
        }
    }
    #endregion

    
    #region Evento para validar si un campo texto es nulo
    protected void validarTexto_ServerValidate(Object source, ServerValidateEventArgs args)
    {
        if (args.Value.Length == 0)
            args.IsValid = false;
        else
            args.IsValid = true;
    }
    #endregion

#region reporte
    protected void lbImprimir_Click(object sender, EventArgs e)
    {
        //Session["parametro"] = Request["idCita"];
        Session["nombreReporte"] = "Animales.rpt";
        Session["URL"] = "Animal.aspx";
        Response.Redirect("ReporteadorAnimales.aspx");
    }
#endregion

}